package demo3;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Person {
//    @Autowired
//     private Shirt shirt;
//    @Autowired
//     private Sweater sweater;
    /*
    实际开发中，我们定义需要用到的依赖时，往往都是以接口形式定义(面向接口)相当于人类的自然表达:我出门应当是穿件"衣服"即可。

    Spring容器自动装配时，如果当前属性类型是一个接口，容器会寻找其管理的对象中没有该接口的实现类，如果有则进行注入动作,但是如果找到多个实现类，则会报错
     */
    @Autowired
    @Qualifier("summer")
    private Clothes clothes;

    public void play(){
        /*
        Person的play方法执行过程中需要使用到Shirt的wear方法完成某些逻辑 这意味着Person类需要【依赖】Shirt类

        原本我们写代码，当我们需要使用一个类时，我们会实例化，该操作又带来了硬编码，如果后期需要使用其他类（不在使用Shirt），这李还需要修改代码

        在Spring容器中的建议：
        如果当前类受热熔器管理，那么这个类如果还依赖其他类时，应当将依赖的类作为【属性】定义，并由容器将需要使用的类设置到属性上供其使用
        这种模式称为：依赖：当前类需要使用这个类来完成它的工作，Shirt就是当前Person类的一个依赖类
                    注入：将依赖的对象通过当前类的属性由容器将其传递进来，这个动作称为"注入"
         */
        //穿上衣服出去玩
         //Shirt shirt = new Shirt();
//         shirt.wear();
//         sweater.wear();
         clothes.wear();
         System.out.println("出去玩");
    }
}
